﻿
namespace CSharpLibs.Annotations
{
	/// <summary>
	/// Is the method a builtin
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class BuiltinMethodAttribute : System.Attribute
	{ }

	/// <summary>
	/// The builtin semantics to use to simulate the effects of the method (the corresponding method body can be safely ignored)
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class BuiltinSemanticsAttribute : System.Attribute
	{
		public System.String CallTarget;
		public BuiltinSemanticsAttribute(System.String str)
		{
			this.CallTarget = str;
		}
	}

	/// <summary>
	/// Takes as an argument a space separated list strings representing the static fields that may be used/modified.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class UsedModStaticsAttribute : System.Attribute
	{
		public System.String Mod;

		public UsedModStaticsAttribute(System.String sv)
		{ this.Mod = sv; }
	}

	/// <summary>
	/// Mark methods that need to be patched in based on template instantiation with this.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class TypePatchNeededAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that advance the given enumerator.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class EnumeratorAdvanceAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters via an enumerator over the simple contents of a collection.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class EnumeratorGetterSimpleContainerAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters via an enumerator over a dictionary.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class EnumeratorGetterDictionaryAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters via an enumerator over the keys in a dictionary.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class EnumeratorGetterDictionaryKeysAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters via an enumerator over the values in a dictionary.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class EnumeratorGetterDictionaryValuesAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters in conjunction with an index variable.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Constructor | System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class CollectionGetterIndexAttribute : System.Attribute
	{ }

	/// <summary>
	/// Mark methods that are considered collection getters in conjunction with an index variable.
	/// </summary>
	[System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Property)]
	public class DoNotClearCollectionPositionAttribute : System.Attribute
	{ }
}
